


function objGet(o) {

	if (typeof o != 'string') return o;

	else return document.getElementById(o);

	}



  /*------------------------------------------------------------*/



  function window_open(pagina,titulo,ancho,largo,x,y){

	var Ventana= 'toolbar=0,location=0,directories=0,scrollbars=1,screenX='+x+',screenY='+y+',status=0,menubar=0,resizable=0,width='+ancho+',height='+largo;

	open(pagina,titulo,Ventana);

}



/*------------------------------------------------------------*/



/* window.onload = Init;  */



var ctrlEvents = false;



var colorInline = 'lightgreen';

var colorBlock = 'yellow';

var colorNSBox = 'black';

var bgcolorNSBox = '#fffff0';



var nodeStack = new Array();

var nsCnt = 0;

var NSBox;



var buttonStyle = 'font:12px/1 sans-serif;font-weight:bold;vertical-align:middle';

var selectStyle = 'font:12px/1 sans-serif;vertical-align:middle';

var iframeStyle = 'width:auto;margin:0;height:250px;';





function Init() {

	if (!thepage) alert('page missing! Editor won\'t work.')

	if (!thestyle) alert('style missing! Editor won\'t work.')

	else {

		var e = document.body;

		initNodes(e);

		createNSBox();

		ctrlEvents = true;

		}

	}



function initNodes(e) {

	if (e.nodeType==1) {

		initNode(e);

		if (e.childNodes) {

			var ch = e.childNodes;

			for (var i=0; i<ch.length; i++) initNodes(ch[i]);

			}

		}

	}



function initNode(e) {

	if (e.nodeType==1) {

		e.onmouseover = nodeHiliteSelf;

		e.onmouseout = nodeUnHiliteSelf;

		e.onclick = nodeActionSelf;

		e.style.cursor = "pointer";

		var n = e.nodeName.toLowerCase();

		if (n=='strong' || n=='a') e.WEnodeType = 'inline'

		else if (n=='body') e.WEnodeType = 'body'

		else e.WEnodeType = 'block';

		var ee = e;

		var ttl = '';

		while (ee && ee!=document) {

			if (ttl) ttl = ee.nodeName.toLowerCase() + ' > ' + ttl;

			else ttl = ee.nodeName.toLowerCase();

			ee = ee.parentNode;

			}

		e.title = 'This element(s): ' + ttl + ' (click to edit)';

		}

	}



function nodeHiliteSelf() {

	if (ctrlEvents) {

		nodeHilite(this);

		return false

		}

	else return true

	}

function nodeUnHiliteSelf() {

	if (ctrlEvents) {

		nodeUnHilite(this);

		return false

		}

	else return true

	}

function nodeActionSelf() {

	if (ctrlEvents) {

		nodeAction(this);

		return false

		}

	else return true

	}



function compBkgr(e) {

	if (document.defaultView && document.defaultView.getComputedStyle)

		return document.defaultView.getComputedStyle(e, '').getPropertyValue("background-color");

	else if (e.currentStyle)

		return e.currentStyle.backgroundColor;

	else return e.style.backgroundColor;

	}

function nodeHilite(e) {

	if (e.WEnodeType!='body') {

		e.WEoldBkgr = compBkgr(e);

		if (e.WEnodeType=='inline') e.style.backgroundColor = colorInline;

		else e.style.backgroundColor = colorBlock;

		}

	}



function nodeUnHilite(e) {

	if (e.WEnodeType!='body')

		e.style.backgroundColor = (e.WEoldBkgr) ? e.WEoldBkgr : "transparent";

	}



function nodeAction(e) {

	ctrlEvents = false;

	buildNSBox(e);

	}



function buildNodeStack(e) {

	var ee = e;

	nsCnt = 0;

	while (ee && ee!=document) {

		nodeStack[nsCnt] = ee;

		nsCnt++;

		ee = ee.parentNode;

		}

	}



function buildNSBox(e) {

	var i,e,en, buff = '<h3>Select element to be styled</strong></h3><p>';

	buildNodeStack(e);

	for (i=0; i<nsCnt; i++) {

		e = nodeStack[i];

		nodeUnHilite(e);

		en = e.nodeName.toLowerCase();

		if (e.id) en += ' id="'+e.id+'"';

		if (e.className) en += ' class="'+e.className+'"';

		buff += '<button style="'+buttonStyle+'" onclick="showTagChoice('+i+')"> &lt;'+en+'&gt; </button><br />';

		if (i<nsCnt-1) buff += '|<br />';

		}

	buff += '</p><hr /><p><button style="'+buttonStyle+'" onclick="closeNSBox(true)"> close </button></p>';

	showNSBox(buff);

	}



function showNSBox(html) {

	NSBox.innerHTML = html;

	NSBox.style.left = '30%';

	NSBox.style.width = '40%';

	NSBox.style.display = 'block';

	}



function closeNSBox(startEvents) {

	nsCnt = 0;

	NSBox.style.display = 'none';

	NSBox.innerHTML = '';

	ctrlEvents = startEvents;

	}



function createNSBox() {

	NSBox = document.createElement('div');

	NSBox.innerHTML = '';

	NSBox.style.position = 'fixed';

	NSBox.style.zIndex = '99999';

	NSBox.style.top = '20px';

	NSBox.style.left = '0';

	NSBox.style.width = '0';

	NSBox.style.padding = '1em';

	NSBox.style.border = '1px solid black';

	NSBox.style.borderRightWidth = '2px';

	NSBox.style.borderBottomWidth = '2px';

	NSBox.style.textAlign = 'center';

	NSBox.style.verticalAlign = 'middle';

	NSBox.style.color = colorNSBox;

	NSBox.style.backgroundColor = bgcolorNSBox;

	NSBox.style.font = '12px/1 sans-serif';

	NSBox.style.display = 'none';

	document.body.appendChild(NSBox);

	}



function showTagChoice(n) {

	var buff = '<h3>This element: ';

	var e = nodeStack[n];

	buildNodeStack(e);

	e = nodeStack[0];

	var en = e.nodeName.toLowerCase();

	var id = (e.id) ? ' id="'+e.id+'"' : '';

	var cl = (e.className) ? ' class="'+e.className+'"' : '';

	buff += '&lt;'+en+id+cl+'&gt;</h3>';

	

	buff += '<hr /><h3>Set style for element:</h3>';



	for (var i=0; i<nsCnt; i++) {

		if (i>0) {

			buff += '<div style="text-align:left">Context '+i+': <input type="checkbox" id="treecheck'+i+'" onclick="checkTreeContext('+i+')" /> ';

			buff += '<select style="'+selectStyle+'" onchange="checkTreeSelects()" id="treeop'+i+'">';

			buff += '<option value="0" selected="selected">anywhere inside</option>';

			buff += '<option value="1">directly inside</option>';

			buff += '</select> ';

			}

		else buff += '<div>';

		buff += '<select style="'+selectStyle+'" onchange="checkTreeSelects()" id="tree'+i+'">';

		en = nodeStack[i].nodeName.toLowerCase();

		buff += '<option value="tag" selected="selected">Any &lt;'+en+'&gt;</option>';

		if (nodeStack[i].id) {

			id = nodeStack[i].id;

			buff += '<option value="id">Exactly id="'+id+'"</option>';

			}

		if (nodeStack[i].className) {

			cl = nodeStack[i].className;

			buff += '<option value="tag.class">Any &lt;'+en+' class="'+cl+'"&gt;</option>';

			buff += '<option value="class">Any element with class="'+cl+'"</option>';

			}

		buff += '</select> ';

		

		buff += '<select style="'+selectStyle+'" onchange="checkTreeSelects()" id="treestate'+i+'">';

		buff += '<option value="any" selected="selected">- any state -</option>';

		if (en=='a') {

			buff += '<option value="link">not visited (:link)</option>';

			buff += '<option value="visited">visited (:visited)</option>';

			}

		buff += '<option value="hover">on mouseover (:hover)</option>';

		buff += '<option value="focus">when focused (:focus)</option>';

		buff += '<option value="active">when activated (:active)</option>';

		buff += '<option value="firstchild">when beeing first child</option>';

		buff += '<option value="firstline">first line of it only</option>';

		buff += '<option value="firstletter">first letter of it only</option>';

		buff += '</select></div>';

		}



	buff += '<hr /><p id="selectorpreview"></p>';

	buff += '<p><button style="'+buttonStyle+'" onclick="editNode('+n+')"> edit style </button></p>';



	buff += '<hr /><p><button style="'+buttonStyle+'" onclick="closeNSBox(true)"> close </button></p>';



	NSBox.innerHTML = buff;



	for (var i=1; i<nsCnt; i++) checkTreeContext(i);



	NSBox.style.left = '10%';

	NSBox.style.width = '80%';

	NSBox.style.display = 'block';

	}



function checkTreeContext(n) {

	var ch = objGet('treecheck'+n);

	objGet('tree'+n).style.visibility = (ch.checked) ? 'visible' : 'hidden';

	objGet('treeop'+n).style.visibility = (ch.checked) ? 'visible' : 'hidden';

	objGet('treestate'+n).style.visibility = (ch.checked) ? 'visible' : 'hidden';

	showSelector();

	}



function checkTreeSelects() {

	showSelector();

	}

function showSelector() {

	var sel = buildSelector();

	sel = sel.replace(/>/,'&gt;');

	objGet('selectorpreview').innerHTML = 'Selector: <strong>'+sel+'</strong>';

	}

	

function buildSelector() {

	var e,sel,op,st, useOp, buff = '';

	for (var i=nsCnt-1; i>=0; i--) {

		e = nodeStack[i];

		sel = objGet('tree'+i).value;

		st = objGet('treestate'+i).value;

		if (i>0) {

			op = objGet('treeop'+i).value;

			useOp = objGet('treecheck'+i).checked;

			}

		else useOp = false;

		if (i==0 || useOp) {

			if (sel=="tag") buff += e.nodeName.toLowerCase();

			else if (sel=="id") buff += '#'+e.id;

			else if (sel=="tag.class") buff += e.nodeName.toLowerCase()+'.'+e.className;

			else if (sel=="class") buff += '.'+e.className;

			if (st=="hover") buff += ':hover';

			else if (st=="focus") buff += ':focus';

			else if (st=="active") buff += ':active';

			else if (st=="link") buff += ':link';

			else if (st=="visited") buff += ':visited';

			else if (st=="firstchild") buff += ':first-child';

			else if (st=="firstline") buff += ':first-line';

			else if (st=="firstletter") buff += ':first-letter';

			}

		if (useOp) {

			if (op=="0") buff += ' ';

			else if (op=="1") buff += ' > ';

			}

		}

	return buff;

	}



function editNode(n) {

	var sel = buildSelector();

	var seltxt = sel.replace('>','&gt;');

	closeNSBox(false);

	document.location.href = 'csseditor.php?thepage='+thepage+'&thestyle='+thestyle+'&sel='+escape(sel);

	}

	

	

/*------------------------------------------------------------*/



//Drop Down/ Overlapping Content: http://www.dynamicdrive.com

//**Updated: Dec 19th, 07': Added ability to dynamically populate a Drop Down content using an external file (Ajax feature)

//**Updated: Feb 29th, 08':

				//1) Added ability to reveal drop down content via "click" of anchor link (instead of default "mouseover")

				//2) Added ability to disable drop down content from auto hiding when mouse rolls out of it

				//3) Added hidediv(id) public function to directly hide drop down div dynamically

                    /*

var dropdowncontent={

	disableanchorlink: true, //when user clicks on anchor link, should link itself be disabled (always true if "revealbehavior" above set to "click")

 hidedivmouseout: [true, 200], //Set hiding behavior within Drop Down DIV itself: [hide_div_onmouseover?, miliseconds_before_hiding]

	ajaxloadingmsg: "Loading content. Please wait...", //HTML to show while ajax page is being feched, if applicable

	ajaxbustcache: true, //Bust cache when fetching Ajax pages?



	getposOffset:function(what, offsettype){

		return (what.offsetParent)? what[offsettype]+this.getposOffset(what.offsetParent, offsettype) : what[offsettype]

	},



	isContained:function(m, e){

		var e=window.event || e

		var c=e.relatedTarget || ((e.type=="mouseover")? e.fromElement : e.toElement)

		while (c && c!=m)try {c=c.parentNode} catch(e){c=m}

		if (c==m)

			return true

		else

			return false

	},



	show:function(anchorobj, subobj, e){

		if (!this.isContained(anchorobj, e)){

			var e=window.event || e

			if (e.type=="click" && subobj.style.visibility=="visible"){

				subobj.style.visibility="hidden"

				return

			}

			var horizontaloffset=(subobj.dropposition[0]=="left")? -(subobj.offsetWidth-anchorobj.offsetWidth) : 0 //calculate user added horizontal offset

			var verticaloffset=(subobj.dropposition[1]=="top")? -subobj.offsetHeight : anchorobj.offsetHeight //calculate user added vertical offset

			subobj.style.left=this.getposOffset(anchorobj, "offsetLeft") + horizontaloffset + "px"

			subobj.style.top=this.getposOffset(anchorobj, "offsetTop")+verticaloffset+"px"

			subobj.style.clip=(subobj.dropposition[1]=="top")? "rect(auto auto auto 0)" : "rect(0 auto 0 0)" //hide drop down box initially via clipping

			subobj.style.visibility="visible"

			subobj.startTime=new Date().getTime()

			subobj.contentheight=parseInt(subobj.offsetHeight)

			if (typeof window["hidetimer_"+subobj.id]!="undefined") //clear timer that hides drop down box?

				clearTimeout(window["hidetimer_"+subobj.id])

			this.slideengine(subobj, (subobj.dropposition[1]=="top")? "up" : "down")

		}

	},



	curveincrement:function(percent){

		return (1-Math.cos(percent*Math.PI)) / 2 //return cos curve based value from a percentage input

	},



	slideengine:function(obj, direction){

		var elapsed=new Date().getTime()-obj.startTime //get time animation has run

		if (elapsed<obj.glidetime){ //if time run is less than specified length

			var distancepercent=(direction=="down")? this.curveincrement(elapsed/obj.glidetime) : 1-this.curveincrement(elapsed/obj.glidetime)

			var currentclip=(distancepercent*obj.contentheight)+"px"

			obj.style.clip=(direction=="down")? "rect(0 auto "+currentclip+" 0)" : "rect("+currentclip+" auto auto 0)"

			window["glidetimer_"+obj.id]=setTimeout(function(){dropdowncontent.slideengine(obj, direction)}, 10)

		}

		else{ //if animation finished

			obj.style.clip="rect(0 auto auto 0)"

		}

	},



	hide:function(activeobj, subobj, e){

		if (!dropdowncontent.isContained(activeobj, e)){

			window["hidetimer_"+subobj.id]=setTimeout(function(){

				subobj.style.visibility="hidden"

				subobj.style.left=subobj.style.top=0

				clearTimeout(window["glidetimer_"+subobj.id])

			}, dropdowncontent.hidedivmouseout[1])

		}

	},



	hidediv:function(subobjid){

		document.getElementById(subobjid).style.visibility="hidden"

	},



	ajaxconnect:function(pageurl, divId){

		var page_request = false

		var bustcacheparameter=""

		if (window.XMLHttpRequest) // if Mozilla, IE7, Safari etc

			page_request = new XMLHttpRequest()

		else if (window.ActiveXObject){ // if IE6 or below

			try {

			page_request = new ActiveXObject("Msxml2.XMLHTTP")

			} 

			catch (e){

				try{

				page_request = new ActiveXObject("Microsoft.XMLHTTP")

				}

				catch (e){}

			}

		}

		else

			return false

		document.getElementById(divId).innerHTML=this.ajaxloadingmsg //Display "fetching page message"

		page_request.onreadystatechange=function(){dropdowncontent.loadpage(page_request, divId)}

		if (this.ajaxbustcache) //if bust caching of external page

			bustcacheparameter=(pageurl.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime()

		page_request.open('GET', pageurl+bustcacheparameter, true)

		page_request.send(null)

	},



	loadpage:function(page_request, divId){

		if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)){

			document.getElementById(divId).innerHTML=page_request.responseText

		}

	},



 init:function(anchorid, pos, glidetime, revealbehavior){

		var anchorobj=document.getElementById(anchorid)

		var subobj=document.getElementById(anchorobj.getAttribute("rel"))

		var subobjsource=anchorobj.getAttribute("rev")

		if (subobjsource!=null && subobjsource!="")

			this.ajaxconnect(subobjsource, anchorobj.getAttribute("rel"))

		subobj.dropposition=pos.split("-")

		subobj.glidetime=glidetime || 1000

		subobj.style.left=subobj.style.top=0

		if (typeof revealbehavior=="undefined" || revealbehavior=="mouseover"){

			anchorobj.onmouseover=function(e){dropdowncontent.show(this, subobj, e)}

			anchorobj.onmouseout=function(e){dropdowncontent.hide(subobj, subobj, e)}

			if (this.disableanchorlink) anchorobj.onclick=function(){return false}

		}

		else

			anchorobj.onclick=function(e){dropdowncontent.show(this, subobj, e); return false}

		if (this.hidedivmouseout[0]==true) //hide drop down DIV when mouse rolls out of it?

			subobj.onmouseout=function(e){dropdowncontent.hide(this, subobj, e)}

	}

}



    */
    

/*------------------------------------------------------------*/





// Title: Tigra Calendar

// URL: http://www.softcomplex.com/products/tigra_calendar/

// Version: 3.2 (ISO date format)

// Date: 10/14/2002 (mm/dd/yyyy)

// Feedback: feedback@softcomplex.com (specify product title in the subject)

// Note: Permission given to use this script in ANY kind of applications if

//    header lines are left unchanged.

// Note: Script consists of two files: calendar?.js and calendar.html

// About us: Our company provides offshore IT consulting services.

//    Contact us at sales@softcomplex.com if you have any programming task you

//    want to be handled by professionals. Our typical hourly rate is $20.



// Adaptations by mikespub for Xaraya :

// - rename functions to avoid potential conflicts with other javascripts

// - find the calendar.html file starting from a base URI

// - use the ISO date format for "generic" date formatting

// TODO: support theme-dependent versions of calendar.html and images



// if two digit year input dates after this year considered 20 century.

var NUM_CENTYEAR = 30;

// is time input control required by default

var BUL_TIMECOMPONENT = false;

// are year scrolling buttons required by default

var BUL_YEARSCROLL = true;



var calendars = [];

var RE_NUM = /^\-?\d+$/;



// URL of the calendar.html file

var STR_HTMLPATH = './';


            function xar_base_calendar(obj_target, base_url) {



	// assing methods

	this.gen_date = xar_base_calendar_gen_date;

	this.gen_time = xar_base_calendar_gen_time;

	this.gen_tsmp = xar_base_calendar_gen_tsmp;

	this.prs_date = xar_base_calendar_prs_date;

	this.prs_time = xar_base_calendar_prs_time;

	this.prs_tsmp = xar_base_calendar_prs_tsmp;

	this.popup    = xar_base_calendar_popup;



	// validate input parameters

	if (!obj_target)

		return xar_base_calendar_error("Error calling the calendar: no target control specified");

	if (obj_target.value == null)

		return xar_base_calendar_error("Error calling the calendar: parameter specified is not valid tardet control");

	this.target = obj_target;

	this.time_comp = BUL_TIMECOMPONENT;

	this.year_scroll = BUL_YEARSCROLL;

	this.base_url = base_url + '/' + STR_HTMLPATH;

	

	// register in global collections

	this.id = calendars.length;

	calendars[this.id] = this;

}




function xar_base_calendar_start(obj_target, base_url) {



	// assing methods

	this.gen_date = xar_base_calendar_gen_date;

	this.gen_time = xar_base_calendar_gen_time;

	this.gen_tsmp = xar_base_calendar_gen_tsmp;

	this.prs_date = xar_base_calendar_prs_date;

	this.prs_time = xar_base_calendar_prs_time;

	this.prs_tsmp = xar_base_calendar_prs_tsmp;

	this.popup    = xar_base_calendar_popup;



	// validate input parameters

	if (!obj_target)

		return xar_base_calendar_error("Error calling the calendar: no target control specified");

	if (obj_target.value == null)

		return xar_base_calendar_error("Error calling the calendar: parameter specified is not valid tardet control");

	this.target = obj_target;

	this.time_comp = BUL_TIMECOMPONENT;

	this.year_scroll = BUL_YEARSCROLL;

	this.base_url = base_url + '/' + STR_HTMLPATH;

	

	// register in global collections

	this.id = calendars.length;

	calendars[this.id] = this;

}

 function xar_base_calendar_end(obj_target, base_url) {



	// assing methods

	this.gen_date = xar_base_calendar_gen_date;

	this.gen_time = xar_base_calendar_gen_time;

	this.gen_tsmp = xar_base_calendar_gen_tsmp;

	this.prs_date = xar_base_calendar_prs_date;

	this.prs_time = xar_base_calendar_prs_time;

	this.prs_tsmp = xar_base_calendar_prs_tsmp;

	this.popup    = xar_base_calendar_popup;



	// validate input parameters

	if (!obj_target)

		return xar_base_calendar_error("Error calling the calendar: no target control specified");

	if (obj_target.value == null)

		return xar_base_calendar_error("Error calling the calendar: parameter specified is not valid tardet control");

	this.target = obj_target;

	this.time_comp = BUL_TIMECOMPONENT;

	this.year_scroll = BUL_YEARSCROLL;

	this.base_url = base_url + '/' + STR_HTMLPATH;

	

	// register in global collections

	this.id = calendars.length;

	calendars[this.id] = this;

}




function xar_base_calendar_popup (str_datetime) {

	this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value);

	if (!this.dt_current) return;



	var obj_calwindow = window.open(

		this.base_url.valueOf() + 'calendar.html?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,

		'Calendar', 'width=200,height='+(this.time_comp ? 215 : 190)+

		',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes'

	);

	obj_calwindow.opener = window;

	obj_calwindow.focus();

}



// timestamp generating function

function xar_base_calendar_gen_tsmp (dt_datetime) {

	return(this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));

}



// date generating function

function xar_base_calendar_gen_date (dt_datetime) {

	return (

		dt_datetime.getFullYear() + "-"

		+ (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "-"

		+ (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate()

	);

}

// time generating function

function xar_base_calendar_gen_time (dt_datetime) {

	return (

		(dt_datetime.getHours() < 10 ? '0' : '') + dt_datetime.getHours() + ":"

		+ (dt_datetime.getMinutes() < 10 ? '0' : '') + (dt_datetime.getMinutes()) + ":"

		+ (dt_datetime.getSeconds() < 10 ? '0' : '') + (dt_datetime.getSeconds())

	);

}



// timestamp parsing function

function xar_base_calendar_prs_tsmp (str_datetime) {

	// if no parameter specified return current timestamp

	if (!str_datetime)

		return (new Date());



	// if positive integer treat as milliseconds from epoch

	if (RE_NUM.exec(str_datetime))

		return new Date(str_datetime);

		

	// else treat as date in string format

	var arr_datetime = str_datetime.split(' ');

	return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));

}



// date parsing function

function xar_base_calendar_prs_date (str_date) {



	var arr_date = str_date.split('-');



	if (arr_date.length != 3) return xar_base_calendar_error ("Invalid date format: '" + str_date + "'.\nFormat accepted is yyyy-mm-dd.");

	if (!arr_date[0]) return xar_base_calendar_error ("Invalid date format: '" + str_date + "'.\nNo year value can be found.");

	if (!RE_NUM.exec(arr_date[0])) return xar_base_calendar_error ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");

	if (!arr_date[1]) return xar_base_calendar_error ("Invalid date format: '" + str_date + "'.\nNo month value can be found.");

	if (!RE_NUM.exec(arr_date[1])) return xar_base_calendar_error ("Invalid month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");

	if (!arr_date[2]) return xar_base_calendar_error ("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");

	if (!RE_NUM.exec(arr_date[2])) return xar_base_calendar_error ("Invalid day of month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");



	var dt_date = new Date();

	dt_date.setDate(1);



	if (arr_date[1] < 1 || arr_date[1] > 12) return xar_base_calendar_error ("Invalid month value: '" + arr_date[1] + "'.\nAllowed range is 01-12.");

	dt_date.setMonth(arr_date[1]-1);

	 

	if (arr_date[0] < 100) arr_date[0] = Number(arr_date[0]) + (arr_date[0] < NUM_CENTYEAR ? 2000 : 1900);

	dt_date.setFullYear(arr_date[0]);



	var dt_numdays = new Date(arr_date[0], arr_date[1], 0);

	dt_date.setDate(arr_date[2]);

	if (dt_date.getMonth() != (arr_date[1]-1)) return xar_base_calendar_error ("Invalid day of month value: '" + arr_date[2] + "'.\nAllowed range is 01-"+dt_numdays.getDate()+".");



	return (dt_date)

}



// time parsing function

function xar_base_calendar_prs_time (str_time, dt_date) {



	if (!dt_date) return null;

	var arr_time = String(str_time ? str_time : '').split(':');



	if (!arr_time[0]) dt_date.setHours(0);

	else if (RE_NUM.exec(arr_time[0])) 

		if (arr_time[0] < 24) dt_date.setHours(arr_time[0]);

		else return xar_base_calendar_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed range is 00-23.");

	else return xar_base_calendar_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed values are unsigned integers.");

	

	if (!arr_time[1]) dt_date.setMinutes(0);

	else if (RE_NUM.exec(arr_time[1]))

		if (arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);

		else return xar_base_calendar_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed range is 00-59.");

	else return xar_base_calendar_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed values are unsigned integers.");



	if (!arr_time[2]) dt_date.setSeconds(0);

	else if (RE_NUM.exec(arr_time[2]))

		if (arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);

		else return xar_base_calendar_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed range is 00-59.");

	else return xar_base_calendar_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed values are unsigned integers.");



	dt_date.setMilliseconds(0);

	return dt_date;

}



function xar_base_calendar_error (str_message) {

	alert (str_message);

	return null;

}

	